package com.zrwl.poscloud.xo.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledFuture;

/**
 * @author 刘思童
 * @create 2022-07-13 10:14
 **/

@Component
@Slf4j
public class TaskBuilder {

    /**
     * @description 定时任务线程池
     */
//    @Autowired
//    private ThreadPoolTaskScheduler threadPoolTaskScheduler;

    /**
     * @description 存放已经启动的任务map，此处使用ConcurrentHashMap进行存储，确保在不同线程下启动任务存放值时产生线程不安全的问题
     * 存放形式：K-任务id ，V- ScheduledFuture对象
     * 作用：统一管理整个系统的定时任务，可以根据任务id来获取定时任务对象，从而进行检查、启动和关闭等操作
     */
    private Map<String, ScheduledFuture> scheduledFutureMap = new ConcurrentHashMap<>();
    /**
     * 根据任务id 判断定时任务是否启动
     */
    public Boolean isStart(String id) {
        //首先检查scheduledFutureMap是否存在该任务，如果不存在，则确定当前任务并没有启动
        if (scheduledFutureMap.containsKey(id)) {
            //当该任务存在时，需要检查scheduledFuture对象是否被取消，如果为false，说明当前线程在启动，否则当前线程处于关闭状态
            if (!scheduledFutureMap.get(id).isCancelled()) {
                return true;
            }
        }
        return false;
    }

    /**
     * 根据任务id 停止定时任务
     */
    public void stop(String id) {
        log.info("进入关闭定时任务 ：{}", id);

        //首先检查当前任务实例是否存在
        if (scheduledFutureMap.containsKey(id)) {
            //获取任务实例
            ScheduledFuture scheduledFuture = scheduledFutureMap.get(id);
            //关闭定时任务
            scheduledFuture.cancel(true);
            log.info("任务{}已成功关闭", id);
        }else {
            log.info("当前任务{}不存在，请重试！", id);
        }
    }

    public void init(String id,String name,String cron,Thread thread){
        log.info("定时任务开始初始化:"+name);
        if (this.isStart(id)) {
            return;
        }
        //启动定时任务
        /**
         * 此处使用ThreadPoolTaskScheduler的schedule方法创建一个周期性执行的任务
         * */
//        ScheduledFuture<?> scheduledFuture = threadPoolTaskScheduler.schedule(thread,
//                new Trigger() {
//                    @Override
//                    public Date nextExecutionTime(TriggerContext triggerContext) {
//                        CronTrigger cronTrigger = new CronTrigger(cron);
//                        return cronTrigger.nextExecutionTime(triggerContext);
//                    }
//                });
        //将已经启动的定时任务实例放入scheduledFutureMap进行统一管理
//        scheduledFutureMap.put(id, scheduledFuture);
        log.info("启动任务：{} 成功！",name);
    }

}
